import hashlib
import random
import string
import time
import re

if __name__ == "__main__":
    # 导入 Django 的环境
    import django
    import sys
    import os

    # 导入django项目的根目录，可以随意导入模块
    django_root_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
    sys.path.insert(0, django_root_path)

    ##导入django环境，能够直接使用django的orm和cache等对象
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tinyurl.settings")
    django.setup()


# 判断是否是http网址
def is_http_url(url):
    pattern = re.compile(r"^https?://[^\s]+$")
    if re.match(pattern, url):
        return True
    else:
        return False


# 生成随机数
def make_random_code():
    characters = (
        string.ascii_letters + string.digits + '@#!$%^&*()_+-=}{[]:;"?/.>,<|\\`~'
    )  # 字符集，大小写字母+数字+特殊字符
    # 3个0-1的随机浮点数
    lis = []
    for i in range(15):
        # 随机0-1
        lis.append(str(random.random())[2:12])
        # 随机选择一个字符
        lis.append(random.choice(characters))
        # 1-10000随机一个数值
        lis.append(str(random.randint(1, 10000)))
    # print('元素个数',len(lis))
    # 在lis中45个元素，随机选择10-30个元素拼接
    ret_str = "".join(random.choice(lis) for _ in range(random.randint(10, 30)))
    return ret_str


# 生成短链接
def generate_short_url(long_url):

    # 拼接待hash的字符串：随机字符串+长url+时间戳
    total_str = f"{make_random_code()}{long_url}{time.time()}"

    # 计算 SHA-256 哈希
    sha256_hash = hashlib.sha256(total_str.encode()).hexdigest()

    # Base62 字符集
    base62_chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

    short_url = ""

    ## sha256生成的是64位的
    add_len = 8
    # 按8位分组
    for i in range(0, len(sha256_hash), add_len):
        # 取8位
        hex_group = sha256_hash[i : i + add_len]

        # 将8位十六进制转换为十进制
        decimal_value = int(hex_group, 16)

        # 对 62 取余
        remainder = decimal_value % 62

        # 映射到 Base62 字符集
        short_url += base62_chars[remainder]
    return short_url


def test_10000(i):
    long_url = (
        f"http://www.baidu.com/example/{i}?location=111,222&title=中国人们&desc=默默"
    )
    # 记录到数据库中
    obj = URLMapping(long_url=long_url)
    obj.save()
    # 通过id转成字符串
    code = generate_short_url(long_url)
    # 记录字符串原始长度
    obj.soure_code_len = len(code)
    obj.short_code = code
    obj.save()


if __name__ == "__main__":
    # 示例长 URL
    from api.models import URLMapping

    set_data = set()
    for i in range(1, 10001):
        test_10000(i)

    short_url = generate_short_url("https://127.0.0.1:80/api/test/sheyh")
    print(short_url)
